home *** CD-ROM | disk | FTP | other *** search
/ BBS in a Box 11 / AMUG BBS in a Box Volume XI (April 1994) (MacWizards).iso / Files / Prog / N-P / OOP for C.sit / OIC.ƒ / oic.h < prev    next >
Encoding:
C/C++ Source or Header  |  1988-12-09  |  3.0 KB  |  103 lines  |  [TEXT/KAHL]

  1. /*
  2.  *    OIC structure definitions
  3.  *
  4.  *            John Wainwright 1987
  5.  */
  6.  
  7. #define myIVs(class,structure)    ((structure *)(&((char *)(self))[class->c_ivoffset]))
  8. #define localIVs(obj,structure) ((structure *)(&((char *)(obj))[currentClass->c_ivoffset]))
  9. #define myCVs(class,structure)    ((structure *)(&((char *)((*self)->c_classvars))[class->c_cvoffset]))
  10. #define localCVs(obj,structure) ((structure *)(&((char *)(*obj)->c_classvars)[currentClass->c_cvoffset]))
  11.  
  12. #define    talloc(t)    (t *)scalloc(sizeof(t))
  13. #define abs(x)        (((x) < 0) ? (-(x)) : (x))
  14. #ifndef NULL
  15.     #define NULL    0L
  16. #endif
  17.  
  18. typedef struct class        *class;
  19. typedef struct class        **object;
  20. typedef struct classlist    classlist;        /* super class list                     */
  21. typedef struct MethodTable    MethodTable;    /* generic function method table     */
  22. typedef struct MethodFunc    MethodFunc;        /* method table function entry        */
  23. typedef char *                keyword_args;    /* for the keyword argument system    */
  24.  
  25. struct classlist
  26. {
  27.     classlist   *cl_next;
  28.     class          cl_class;
  29. };
  30.  
  31. struct MethodFunc                        /* method function table entry    */
  32. {
  33.     object    (*mf_func)();                /* method function                */
  34.     class      mf_from;                    /* class from which inherited     */
  35. };
  36.     
  37. struct class
  38. {
  39.     class          c_classtag;                /* class class                    */
  40.     class          c_next;                    /* class list link                */
  41.     char        *c_name;                /* class name for debugging        */
  42.     int            c_ivsize;                /* total IVs size                */
  43.     int            c_cvsize;                /* total CVs size                */
  44.     int            c_ivoffset;                /* offset to local iv struct    */
  45.     int            c_cvoffset;                /* offset to local cv struct    */
  46.     int            c_allocz;                /* total object size            */
  47.     int            c_index;                /* class index into mthd-tables    */
  48.     char        *c_classvars;            /* class vars block (if any)    */
  49.     classlist   *c_superclasses;        /* superclass list                */
  50. };
  51.  
  52. extern char        *salloc();
  53. extern char        *scalloc();
  54.  
  55. extern class      NewClass();
  56. extern class      currentClass;
  57. extern class      classes;
  58. extern object    New();
  59. extern object    Method();
  60. extern object    ClassMethod();
  61. extern object    Super();
  62. extern object    SuperPassArgs();
  63. extern int        SizeOf();
  64. extern char     *ClassNameOf();
  65. extern char        *MethodName();
  66. extern int        IsAKindOf();
  67. extern int        IsA();
  68. extern int        IsObj();
  69. extern object    key_arg();
  70.  
  71. #define ClassOf(x)    ((class)*(x))
  72.  
  73. #define CLASS        1            /* index of class method table            */
  74. #define    END            0L
  75.  
  76. struct MethodTable
  77. {
  78.     int            mth_minClass;            /* lowest class index            */
  79.     int            mth_maxClass;            /* highest class index            */
  80.     char        *mth_name;                /* generic function name        */
  81.     MethodFunc    *mth_funcs;                /* table of method functions    */
  82. };
  83.  
  84. #define defGeneric(mth, methTable, name)                    \
  85.     MethodTable methTable[2] =                                \
  86.     {                                                        \
  87.         { 0, 0, name, 0    }, { 0, 0, name, 0 }                \
  88.     };                                                        \
  89.     object                                                    \
  90.     mth(obj, args)                                            \
  91.         object     obj;                                        \
  92.         char    *args;                                        \
  93.     {                                                          \
  94.         return                                                \
  95.             (ClassOf(obj) == Class)    ?                        \
  96.                 ClassMethod(&methTable[CLASS], obj, &args)    \
  97.             :                                                \
  98.                 Method(&methTable, obj, &args);                \
  99.     }
  100.  
  101. #define externGeneric(mth, mthTable)             \
  102.     extern MethodTable     mthTable[2];            \
  103.     extern object        mth();